[Coading Test] 시저암호

level : 1

Coading Test
Author

신호연

Published

January 9, 2023

문제

나의 풀이

def solution(s, n):
    upper_ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    answer = ""
    for el_s in s:
        #1.맨 마지막 리턴을 위해 원래 문자가 소문자인지 대문자인지 기억 and 대문자에서 검색할것이기 때문에 대문자로 변환
        #대문자로 변환된 문자열 s의 각각의 문자,대소문자 여부
        if el_s == " ":
            answer += " "
        elif el_s.isupper() == True:
            was_upper = True
        else:
            was_upper = False
            el_s = el_s.upper()
        #2.인덱스 숫자가 upper_ch에서 벗어날때 아닐때 처리
        for idx,up_ch in enumerate(upper_ch):
            if el_s == up_ch and idx + n <= len(upper_ch)-1:
                find_idx = idx+n
                if was_upper == True:
                    answer += upper_ch[find_idx]
                else:
                    answer += upper_ch[find_idx].lower()        
            elif el_s == up_ch and idx + n > len(upper_ch)-1:
                find_idx = n-len(upper_ch[idx:])
                if was_upper == True:
                    answer += upper_ch[find_idx]
                else:
                    answer += upper_ch[find_idx].lower()  
    return answer

다른 풀이

def caesar(s, n):
    lower_list = "abcdefghijklmnopqrstuvwxyz"  
    #소문자도 리스트로 만듦 
    #좋은점->대소문자 여부를 기억하는 코드 불필요(조건문)
    #안좋은점->소문자로 이뤄진 리스트를 만드는데 그만큼의 메모리 필요
    upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    
    
    
    result = [] 
    #문자열들을 저장할 list를 만듦
    #mutable로 붙이는 것과 immutable로 붙이는 것 차이
    #속도 -> 
    #mutable이 더 빠름,
    #그러나 garbage collector도 고려시 스캔범위가 너무커서 느려질수도?
    #메모리 -> immutable이 더 적게들을 듯(리스트는 이중포인터같은 구조라서 이렇게 예상됨)
    for i in s:
        if i == " ":
            result.append(" ")
        elif i.islower() is True:
            new_ = lower_list.find(i) + n
            result.append(lower_list[new_ % 26]) 
            #나머지로 계산하는 방식,이게 더 간단하고 좋은듯
            #반복문이 문자열에 대해서 돌다보니 문자열과 문자열의 인덱스 위주로 너무 생각함
            #어떤 숫자(여기서는 인덱스)보다 크거나 같을때에 다시 0부터 줘야하는 상황? -> 나머지 활용
        else:
            new_ = upper_list.find(i) + n
            result.append(upper_list[new_ % 26])
    return "".join(result)

나중에 볼 링크
링크1
링크2
링크3